package com.ads.tpgrupo4.server.remote;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.List;

import com.ads.tpgrupo4.domain.cpr.core.Cliente;
import com.ads.tpgrupo4.domain.cpr.core.Rodamiento;
import com.ads.tpgrupo4.domain.cpr.cotizacion.Cotizacion;
import com.ads.tpgrupo4.domain.cpr.facturacion.Factura;
import com.ads.tpgrupo4.domain.cpr.ordenDeCompra.OrdenDeCompra;
import com.ads.tpgrupo4.domain.cpr.ordenDePedido.EstadoOrdenDePedido;
import com.ads.tpgrupo4.domain.cpr.ordenDePedido.OrdenDePedido;
import com.ads.tpgrupo4.domain.cpr.proveedores.ItemListaDePrecios;
import com.ads.tpgrupo4.domain.cpr.proveedores.ListaDePrecios;
import com.ads.tpgrupo4.domain.cpr.proveedores.Proveedor;
import com.ads.tpgrupo4.domain.cpr.remito.EstadoRemitoDeProveedor;
import com.ads.tpgrupo4.domain.cpr.remito.Remito;
import com.ads.tpgrupo4.domain.cpr.remito.RemitoACliente;
import com.ads.tpgrupo4.domain.cpr.remito.RemitoDeProveedor;
import com.ads.tpgrupo4.domain.cpr.solicitudDeCotizacion.EstadoSolicitudDeCotizacion;
import com.ads.tpgrupo4.domain.cpr.solicitudDeCotizacion.SolicitudDeCotizacion;
import com.ads.tpgrupo4.dtos.ItemListaComparativaDePreciosDTO;
import com.ads.tpgrupo4.dtos.ListaComparativaDePreciosSearchDTO;
import com.ads.tpgrupo4.persistence.api.IPersistenceService;

public class PersistenceService implements IPersistenceService {
	
	private static PersistenceService instance;
	
	private IPersistenceService persistenceService;
	
	public static PersistenceService getInstance() {
		
		if (instance == null) {
			instance = new PersistenceService();
		}

		return instance;
	}
	
	private PersistenceService() {
		this.init();
	}
	
    private void init() {
    	try {
    		this.persistenceService = (IPersistenceService) Naming.lookup("PersistenceService");
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (NotBoundException e) {
			e.printStackTrace();
		}
    }

	@Override
	public void saveRodamientos(List<Rodamiento> rodamientos) throws RemoteException {

		this.persistenceService.saveRodamientos(rodamientos);
	}

	@Override
	public Rodamiento findRodamiento(String serie, String sufijo, String marca,
			String origen) throws RemoteException {
		
		return this.persistenceService.findRodamiento(serie, sufijo, marca, origen);
	}

	@Override
	public void deleteRodamiento(Rodamiento rodamiento) throws RemoteException {
		
		this.persistenceService.deleteRodamiento(rodamiento);
	}

	@Override
	public Proveedor findProveedor(String cuil)  throws RemoteException {
		
		return this.persistenceService.findProveedor(cuil);
	}

	@Override
	public ListaDePrecios findListaDePrecios(Long idProveedor,
			Long numeroDeLista) throws RemoteException {

		return this.persistenceService.findListaDePrecios(idProveedor, numeroDeLista);
	}

	@Override
	public void saveListaDePrecios(ListaDePrecios listaDePrecios)
			throws RemoteException {
		
		this.persistenceService.saveListaDePrecios(listaDePrecios);
	}

	@Override
	public List<ItemListaComparativaDePreciosDTO> searchInfoComparativaDePreciosDeRodamientos(
			ListaComparativaDePreciosSearchDTO search) throws RemoteException {

		return this.persistenceService.searchInfoComparativaDePreciosDeRodamientos(search);
	}

	@Override
	public void saveProveedor(final Proveedor proveedor) throws RemoteException {
		
		this.persistenceService.saveProveedor(proveedor);
	}

	@Override
	public Cliente findCliente(final String cuil) throws RemoteException {
		
		return this.persistenceService.findCliente(cuil);
	}

	@Override
	public void saveSolicitudDeCotizacion(final SolicitudDeCotizacion solicitudDeCotizacion)
			throws RemoteException {
		
		this.persistenceService.saveSolicitudDeCotizacion(solicitudDeCotizacion);		
	}

	@Override
	public List<SolicitudDeCotizacion> findSolicitudesDeCotizacionPendientes() throws RemoteException {
		
		return this.persistenceService.findSolicitudesDeCotizacionPendientes();
	}

	@Override
	public void saveCotizacion(Cotizacion cotizacion) throws RemoteException {
		
		this.persistenceService.saveCotizacion(cotizacion);
	}

	@Override
	public void updateEstadoSolicitudDeCotizacion(Long id,
			EstadoSolicitudDeCotizacion estado) throws RemoteException {
		
		this.persistenceService.updateEstadoSolicitudDeCotizacion(id, estado);
	}

	@Override
	public List<Cotizacion> getCotizaciones() throws RemoteException {

		return this.persistenceService.getCotizaciones();
	}

	@Override
	public Cotizacion findCotizacionByNumero(Long nro)  throws RemoteException {
		return this.persistenceService.findCotizacionByNumero(nro);
	}

	@Override
	public void saveOrdenDePedido(OrdenDePedido op) throws RemoteException {
		this.persistenceService.saveOrdenDePedido(op);
	}

	@Override
	public List<OrdenDePedido> findOrdenesDePedidoPendientes()
			throws RemoteException {

		return this.persistenceService.findOrdenesDePedidoPendientes();
	}

	@Override
	public ItemListaDePrecios findItemListaDePreciosById(Long id) throws RemoteException {

		return this.persistenceService.findItemListaDePreciosById(id);
	}

	@Override
	public ListaDePrecios findListaDePreciosAsociadaA(ItemListaDePrecios item) throws RemoteException {
		
		return this.persistenceService.findListaDePreciosAsociadaA(item);
	}

	@Override
	public void saveOrdenesDeCompra(List<OrdenDeCompra> ordenesDeCompra)
			throws RemoteException {
		
		this.persistenceService.saveOrdenesDeCompra(ordenesDeCompra);
	}

	@Override
	public void updateEstadoOrdenDePedido(Long id, EstadoOrdenDePedido estado)
			throws RemoteException {
		
		this.persistenceService.updateEstadoOrdenDePedido(id, estado);		
	}

	@Override
	public List<OrdenDeCompra> getOrdenesDeCompra() throws RemoteException {

		return this.persistenceService.getOrdenesDeCompra();
	}

	@Override
	public OrdenDeCompra findOrdenDeCompraByNumero(Long nro)
			throws RemoteException {

		return this.persistenceService.findOrdenDeCompraByNumero(nro);
	}

	@Override
	public void saveRemito(Remito remito) throws RemoteException {

		this.persistenceService.saveRemito(remito);		
	}

	@Override
	public void saveCliente(Cliente cliente) throws RemoteException {
		
		this.persistenceService.saveCliente(cliente);	
	}

	@Override
	public List<RemitoDeProveedor> findRemitosConMercaderiaNoEntregada() throws RemoteException {

		return this.persistenceService.findRemitosConMercaderiaNoEntregada();
	}

	@Override
	public void saveRemitosAClientes(List<RemitoACliente> remitos) throws RemoteException {
		
		this.persistenceService.saveRemitosAClientes(remitos);
	}

	@Override
	public void updateEstadoRemitoDeProveedor(Long remitoDeProveedorId,
			EstadoRemitoDeProveedor nuevoEstado) throws RemoteException {
		
		this.persistenceService.updateEstadoRemitoDeProveedor(remitoDeProveedorId, nuevoEstado);
	}
	

	@Override
	public void updateEstadoFacturadoRemitoACliente(Long remitoAClienteId, Boolean facturado)
			throws RemoteException {
		
		this.persistenceService.updateEstadoFacturadoRemitoACliente(remitoAClienteId, facturado);
	}

	@Override
	public List<RemitoACliente> getRemitosACliente() throws RemoteException {

		return this.persistenceService.getRemitosACliente();
	}

	@Override
	public OrdenDePedido findOrdenDePedidoByNumeroCotizacion(Long numeroDeCotizacion)
			throws RemoteException {

		return this.persistenceService.findOrdenDePedidoByNumeroCotizacion(numeroDeCotizacion);
	}

	@Override
	public List<RemitoACliente> findRemitosAClienteNoFacturados()
			throws RemoteException {
		
		return this.persistenceService.findRemitosAClienteNoFacturados();
	}

	@Override
	public void saveFacturas(List<Factura> facturas) throws RemoteException {
		
		this.persistenceService.saveFacturas(facturas);
	}

	@Override
	public List<Factura> getFacturas() throws RemoteException {
		
		return this.persistenceService.getFacturas();
	}

}
